/**
 * 
 */
package com.cuc.platform.core.componet.security.dao;

import java.util.List;
import java.util.Map;

import org.springframework.dao.DataAccessException;

import com.cuc.platform.core.componet.security.domain.SecurityMenu;

/**
 * @author peepul
 * 
 * 菜单访问DAO接口
 */
public interface SecurityMenuDao {
	/**
	 * 取所有菜单对象
	 * 
	 * @return SecurityAuthority List
	 */
	public List<SecurityMenu> getAllMenus();

	/**
	 * 根据主标识获取指定的SecurityMenu对象
	 * 
	 * @param  id
	 * @return SecurityMenu
	 * @throws Exception
	 */
	public SecurityMenu getMenuById(Long id);

	/**
	 * 新增菜单对象
	 * 
	 * @param menu
	 * @throws DataAccessException
	 */
	public void insertMenu(SecurityMenu menu) throws DataAccessException;
	
	/**
	 * 更新菜单对象
	 * 
	 * @param menu
	 * @throws DataAccessException
	 */
	public void updateMenu(SecurityMenu menu) throws DataAccessException;
	
	/**
	 * 根据id删除menu对象
	 * 
	 * 注：删除成功返回值为1，如没找到要删除的数据返回0，如果删除出错，则产生异常
	 * @param id
	 */
	public int delMenuById(Long id) throws DataAccessException;
	
	/**
	 * 根据指定的菜单级别，显示出对应层次的菜单项列表
	 * 
	 * @param level：
	 * 	如：	0：一级菜单
	 * 		1：二级菜单
	 *      3：三级菜单
	 *      N：N级菜单 
	 *      
	 * @return List<SecurityMenu>
	 */
	public List<SecurityMenu> listMenuByLevel(Integer level);
	
	/**
	 * 根据指定的菜单项id，获取其子菜单项列表数据
	 * 
	 * @param id
	 * 
	 * @returnList<SecurityMenu>
	 */
	public List<SecurityMenu> listSubMenu(Long id);
	
	/**
	 * 根据用户账号，获取其对应的菜单项
	 * 
	 * 注：根据账号获取角色，再根据角色获取对应的菜单项。
	 *     由于用户、角色、菜单都是多对多的对应关系，需要过滤掉重复的菜单数据
	 * 
	 * @param userName 登录账号
	 */
	public List<SecurityMenu> listMenuByUser(String userName);
	
	/**
	 * 根据用户账号，获取其对应的某一层次级别的菜单项
	 * 
	 * 注：本方法是为方便使用而设定。
	 *     在listMenuByUser(String userName)返回的结果集之上，进一步获取指定层次级别的菜单项
	 *     
	 * @param Map<String, Integer> 
	 *        String userName 登录账号
	 *        Integer level   层次级别
	 *        
	 * @return List<SecurityMenu> 包含所有该用户对应的某一级别的菜单项集合
	 */
	public List<SecurityMenu> listMenuByUserWithLevel(Map<String, Object> paramMap);
	
	/**
	 * 查看某个菜单对应的角色及所有待选择的角色
	 * 
	 * 如果某个角色被选中，则对应的菜单对象不为空
	 * 
	 * @param menu_id
	 * @return List<SecurityMenu>
	 */
	public List<SecurityMenu> viewRoleswithMenus(Long menu_id);
	
	/**
	 * 查看某个角色对应的菜单及所有待选择的菜单
	 * 
	 * 如果某个菜单被选中，则对应的角色对象不为空
	 * 
	 * @param role_id
	 * @return List<SecurityMenu>
	 */
	public List<SecurityMenu> viewMenuswithRoles(Long role_id);
	
	/**
	 * 根据role_id删除ss_menu_role中已有的关联关系
	 * 
	 * @param role_id
	 */
	public void delRoleMenuUnions(Long role_id) throws DataAccessException;
	
	/**
	 * 根据menu_id删除ss_menu_role中已有的关联关系
	 * 
	 * @param menu_id
	 */
	public void delRoleMenuUnionsByMenu(Long menu_id) throws DataAccessException;
	
	/**
	 * 保存角色与菜单的关联关系。往ss_menu_role中保存关联数据
	 * 
	 * @param map
	 */
	public void saveRoleMenuUnions(Map<String, Long> map);
}
